package array;

/**
 * 森林中有未知数量的兔子。提问其中若干只兔子 "还有多少只兔子与你（指被提问的兔子）颜色相同?" ，将答案收集到一个整数数组 answers 中，其中
 * answers[i] 是第 i 只兔子的回答。
 * 给你数组 answers ，返回森林中兔子的最少数量。
 * <p>
 * 示例 1：
 * 输入：answers = [1,1,2]
 * 输出：5
 * 解释：
 * 两只回答了 "1" 的兔子可能有相同的颜色，设为红色。
 * 之后回答了 "2" 的兔子不会是红色，否则他们的回答会相互矛盾。
 * 设回答了 "2" 的兔子为蓝色。
 * 此外，森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
 * 因此森林中兔子的最少数量是 5 只：3 只回答的和 2 只没有回答的。
 * <p>
 * 示例 2：
 * 输入：answers = [10,10,10]
 * 输出：11
 *
 * @author Jisheng Huang
 * @version 20250420
 */
public class RabbitsInForest_781 {
    /**
     * The basic thought is: if answers[i] == anwers[j], we take them as the same color as far as possible.
     * What does the possible mean? Well, we can see a example:
     * Condider a anwer sequence [2, 2, 2, 2]. According to the Pigeonhole Principle, we cannot take all of them as the
     * same color since there are at most 3 pigeonhole and 4 pigeons.
     * <p>
     * The solution is using a array color to record the color message. Each time a pigeonhole is full when reset
     * corresponding element in color.
     *
     * @param answers
     * @return
     */
    public static int numRabbits(int[] answers) {
        int res = 0;
        int[] color = new int[1001];

        for (int i = 0; i < answers.length; ++i) {
            if (color[answers[i] + 1] == answers[i] + 1) {
                res += answers[i] + 1;
                color[answers[i] + 1] = 1;
            } else {
                ++color[answers[i] + 1];
            }
        }

        for (int i = 0; i < color.length; ++i) {
            res += color[i] != 0 ? i : 0;
        }

        return res;
    }

    public static void main(String[] args) {
        int[] nums = {1, 1, 2};
        System.out.println(numRabbits(nums));

        nums = new int[]{10, 10, 10};
        System.out.println(numRabbits(nums));
    }
}
